package com.firefly.admin.common.config;

import io.netty.channel.Channel;
import io.netty.channel.group.ChannelGroup;
import io.netty.channel.group.DefaultChannelGroup;
import io.netty.util.concurrent.GlobalEventExecutor;
import org.springframework.context.annotation.Configuration;

import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

@Configuration
public class NettyConfig {

    /**
     * 存储所有在线的客户端Channel
     * <p>
     * ChannelGroup是Netty中的一种特殊的Channel容器，用于管理多个Channel对象。
     * 它可以用来跟踪和管理与服务器建立的所有活动连接。
     * 广播消息：可以通过ChannelGroup向其中的所有Channel广播消息，实现一次性向多个客户端发送相同的消息。
     * 批量操作：可以对ChannelGroup中的所有Channel进行批量操作，例如批量关闭连接、批量发送消息等。
     * 管理连接：通过ChannelGroup可以方便地管理和跟踪与服务器建立的连接，包括添加新的连接、删除断开的连接、获取连接数量等。
     * 使用ChannelGroup可以有效地管理多个Channel，简化了对连接的管理和操作，特别适用于需要同时处理多个连接的情况，例如实现聊天室、推送系统等。
     */
    private static final ChannelGroup channelGroup = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);

    /**
     * 存储所有在线的UserId与之对应的Channel
     * <p>
     * ConcurrentHashMap是Java中的一个线程安全的哈希表实现类，它继承自AbstractMap类，实现了ConcurrentMap接口。
     * 与HashMap相比，ConcurrentHashMap在多线程环境下提供了更好的并发性能和线程安全性。
     * 它采用了分段锁的机制，将整个哈希表分成多个段（Segment），每个段维护一个独立的哈希表。
     * 不同的线程可以同时访问不同的段，从而实现了并发读写的能力。
     */
    private static final ConcurrentMap<String, Channel> channelMap = new ConcurrentHashMap<>();

    /**
     * 获取所有在线的客户端Channel
     */
    public static ChannelGroup getChannelGroup() {
        return channelGroup;
    }

    /**
     * 获取所有在线的UserId与之对应的Channel
     */
    public static ConcurrentMap<String, Channel> getChannelMap() {
        return channelMap;
    }
}
